package com.itheima.aop;

import com.itheima.mapper.EmpLoginLogMapper;
import com.itheima.pojo.Emp;
import com.itheima.pojo.EmpLoginLog;
import com.itheima.pojo.LoginInfo;
import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Slf4j
@Aspect
@Component
public class LoginLogAspect {
    //该代码是一个AOP切面，用于记录员工登录日志。主要功能包括：
    //1. 在登录接口执行前后记录耗时；
    //2. 根据登录结果（成功/失败）记录相关信息（用户名、密码、JWT等）；
    //3. 将登录日志保存到数据库；
    //4. 若登录异常，也记录失败日志并抛出异常。

    @Autowired
    private EmpLoginLogMapper empLoginLogMapper;

    @Around("execution(* com.itheima.controller.LoginController.login(..))")//登录接口
    public Object recordLoginLog(ProceedingJoinPoint joinPoint) throws Throwable {
        // 记录开始时间
        long startTime = System.currentTimeMillis();

        // 获取方法参数（Emp对象）
        Object[] args = joinPoint.getArgs();//获取方法参数
        Emp emp = (Emp) args[0]; // 正确转换为Emp对象
        String username = emp.getUsername();
        String password = emp.getPassword(); // 假设Emp类有getPassword方法

        try {
            // 执行原始方法
            Object result = joinPoint.proceed();//调用joinPoint.proceed()执行LoginController.login()方法，获取登录结果（Result对象）。

            // 计算耗时
            long costTime = System.currentTimeMillis() - startTime;

            // 判断登录是否成功并获取JWT令牌
            Result loginResult = (Result) result;
            Short isSuccess = (short) (loginResult.getCode() == 1 ? 1 : 0); // 1:成功, 0:失败
            String jwt = "登录失败";

            // 如果登录成功，从LoginInfo中获取JWT
            if (isSuccess == 1 && loginResult.getData() instanceof LoginInfo) {
                LoginInfo loginInfo = (LoginInfo) loginResult.getData();
                jwt = loginInfo.getToken(); // 假设LoginInfo有getToken方法
            }

            // 创建登录日志对象
            EmpLoginLog empLoginLog = new EmpLoginLog();
            empLoginLog.setUsername(username);
            empLoginLog.setPassword(password);
            empLoginLog.setLoginTime(LocalDateTime.now());
            empLoginLog.setIsSuccess(isSuccess);
            empLoginLog.setJwt(jwt);
            empLoginLog.setCostTime(costTime);

            // 保存到数据库
            empLoginLogMapper.insert(empLoginLog);

            // 记录日志
            log.info("员工登录日志已记录到数据库: 用户名={}, 密码={}, 登录时间={}, 是否成功={}, JWT={}, 耗时={}ms",
                    username, password, empLoginLog.getLoginTime(),
                    isSuccess == 1 ? "成功" : "失败", jwt, costTime);

            return result;
        } catch (Exception e) {
            // 异常情况也记录到数据库
            long costTime = System.currentTimeMillis() - startTime;

            EmpLoginLog empLoginLog = new EmpLoginLog();
            empLoginLog.setUsername(username);
            empLoginLog.setPassword(password);
            empLoginLog.setLoginTime(LocalDateTime.now());
            empLoginLog.setIsSuccess((short) 0); // 0:失败
            empLoginLog.setJwt("无");
            empLoginLog.setCostTime(costTime);

            // 保存到数据库
            empLoginLogMapper.insert(empLoginLog);

            log.error("员工登录异常已记录到数据库: 用户名={}, 密码={}, 登录时间={}, 是否成功={}, JWT={}, 耗时={}ms, 异常信息={}",
                    username, password, empLoginLog.getLoginTime(), "失败", "无", costTime, e.getMessage());

            throw e;
        }
    }
}
